#include <iostream>
#include "TcpServer.hpp"
#include "ServerCal.hpp"
#include <memory>
#include <functional>

void manual(char* argv)
{
    std::cout<< argv << " port"<<std::endl;
}

int main(int argc,char* argv[])
{
    if(argc != 2 )
    {
        manual(argv[0]);
        exit(1);
    }
    uint16_t port = std::stoi(argv[1]);
    // td::unique_ptr<TcpServer> tcp_svr(new TcpServer(port));
    //bind 的语法规则：第一个参数是可以调用对象，而后面的参数是用于给可调用对象调整参数顺序和个数的！
    //所以这里的含义是，可调用对象，参数，和placeholder_1绑定那个参数在第一个的位置，其实就是把ServerCal()这个参数写死在第一位
    std::unique_ptr<TcpServer> tcpserver(new TcpServer(port,std::bind(&ServerCal::Calculator,ServerCal(),std::placeholders::_1)));
    tcpserver->initServer();
    tcpserver->Start();

    /* 测试protocol*/
    // response resp(1, 2);
    // std::string out;
    // resp.Serialize(&out);
    // std::cout << out << std::endl;
    // std::string package = encode(out);
    // std::cout << package << std::endl;
    // std::string content;
    // decode(package, &content);
    // std::cout << content << std::endl;
    // response temp;
    // temp.Deserialize(content);
    // std::cout<<temp.result<<temp.code<<std::endl;
    return 0;
}